package com.ftloverdrive.core; import java.io.File; import java.io.IOException; import com.badlogic.gdx.Application; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver; import com.badlogic.gdx.assets.loaders.resolvers.ExternalFileHandleResolver; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; import com.badlogic.gdx.graphics.g2d.Animation; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.PixmapPacker; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Logger; import com.ftloverdrive.io.FreeTypeFontLoader; import com.ftloverdrive.io.RelativeFileHandleResolver; import com.ftloverdrive.io.URIFileHandleResolver; import com.ftloverdrive.net.OVDNetManager; import com.ftloverdrive.ui.screen.OVDScreenManager; import com.ftloverdrive.util.OVDReferenceManager; public class OverdriveGame implements ApplicationListener { public static final String APP_NAME = "Overdrive"; public static final String APP_VERSION = "0.1"; private static final String ENV_APP_PATH = "OVERDRIVE_APP_PATH"; // Don't instantiate early, or the classloader might complain? private Logger log; private File appDir; private File resourcesDir; private URIFileHandleResolver fileHandleResolver; private AssetManager assetManager; private OVDScreenManager screenManager; private OVDReferenceManager refManager; private OVDNetManager netManager; private Screen currentScreen = null; private com.ftloverdrive.net.NetworkTest networkTest; // TODO: Remove me. @Override public void create () { Gdx.app.setLogLevel( Application.LOG_DEBUG ); log = new Logger( OverdriveGame.class.getCanonicalName(), Logger.DEBUG ); log.info( String.format( "%s v%s", APP_NAME, APP_VERSION ) ); log.info( String.format( "%s %s", System.getProperty("os.name"), System.getProperty("os.version") ) ); log.info( String.format( "%s, %s, %s", System.getProperty("java.vm.name"), System.getProperty("java.version"), System.getProperty("os.arch") ) ); appDir = new File( "." ); log.info( "CWD: "+ appDir.getAbsolutePath() ); String envAppPath = System.getenv( ENV_APP_PATH ); if ( envAppPath != null && envAppPath.length() > 0 ) { File envAppDir = new File( envAppPath ); if ( envAppDir.exists() ) { log.info( String.format( "Environment var (%s) changed app path: %s", ENV_APP_PATH, envAppPath ) ); appDir = envAppDir; } else { log.error( String.format( "Environment var (%s) set a non-existent app path: %s", ENV_APP_PATH, envAppPath ) ); } } resourcesDir = new File( appDir, "resources" ); java.nio.IntBuffer buf = com.badlogic.gdx.utils.BufferUtils.newIntBuffer(16); Gdx.gl.glGetIntegerv( GL10.GL_MAX_TEXTURE_SIZE, buf ); int maxTextureSize = buf.get(); log.debug( "Device Estimated Max Texture Size: "+ maxTextureSize ); log.debug( "Device GL11: "+ Gdx.graphics.isGL11Available() ); log.debug( "Device GL20: "+ Gdx.graphics.isGL20Available() ); fileHandleResolver = new URIFileHandleResolver(); fileHandleResolver.setResolver( "internal:", new InternalFileHandleResolver(), true ); fileHandleResolver.setResolver( "external:", new ExternalFileHandleResolver(), true ); fileHandleResolver.addDefaultResolver( new RelativeFileHandleResolver( resourcesDir ) ); fileHandleResolver.addDefaultResolver( new RelativeFileHandleResolver( appDir ) ); fileHandleResolver.addDefaultResolver( new InternalFileHandleResolver() ); refManager = new OVDReferenceManager(); netManager = new OVDNetManager(); assetManager = new AssetManager( fileHandleResolver ); assetManager.setLoader( BitmapFont.class, new FreeTypeFontLoader( fileHandleResolver ) ); OverdriveContext context = new OverdriveContext(); context.init( this, null, -1 ); screenManager = new OVDScreenManager( context ); screenManager.showScreen( screenManager.getInitScreenKey() ); networkTest = new com.ftloverdrive.net.NetworkTest(); //networkTest.init(); } /** * Returns the main FileHandleResolver. * * Usage: * FileHandle fh = getFileHandleResolver().resolve( pathString ); * // If you need a File object... * File f = fh.file(); * * Given a string, this resolver will look in several locations. * {current_dir|APP_PATH}/resources/... * {current_dir|APP_PATH}/... * {internal}/... * * If a URI prefix is found, that will be stripped, and a specific * location will be checked instead. * internal://... - Root of the jar, and current dir on desktop. * external://... - Android SD card, or desktop user's home dir. */ public FileHandleResolver getFileHandleResolver() { return fileHandleResolver; } /** * Returns a manager to load assets. * * This one can load ttf fonts: * String assetString = ".../myfont.ttf?size=10"; * assetManager.load( assetString, BitmapFont.class ); * assetManager.finishLoading(); * BitmapFont font = assetManager.get( assetString, BitmapFont.class ); */ public AssetManager getAssetManager() { return assetManager; } /** * Returns a manager to change screens. */ public OVDScreenManager getScreenManager() { return screenManager; } /** * Returns a manager to link objects together by reference ids. */ public OVDReferenceManager getReferenceManager() { return refManager; } /** * Returns a manager to request new reference ids. */ public OVDNetManager getNetManager() { return netManager; } /** * Hides the current screen and shows another. * * This shouldn't be called directly. * Use getScreenManager() instead. */ public void setScreen( Screen screen ) { if ( currentScreen != null ) currentScreen.hide(); currentScreen = screen; if ( currentScreen != null ) currentScreen.show(); } public Screen getScreen() { return currentScreen; } @Override public void resize( int width, int height ) { log.info( String.format( "Screen resized: %dx%d", width, height ) ); if ( currentScreen != null ) currentScreen.resize( width, height ); } @Override public void render() { if ( currentScreen != null ) currentScreen.render( Gdx.graphics.getDeltaTime() ); } @Override public void pause() { if ( currentScreen != null ) currentScreen.pause(); } @Override public void resume() { if ( currentScreen != null ) currentScreen.resume(); } @Override public void dispose () { if ( currentScreen != null ) currentScreen.dispose(); screenManager.dispose(); assetManager.dispose(); networkTest.shutdown(); } }